Skip to content

feat(git): 支持工作区根目录为 Git 仓库时仍探测并展示子目录独立仓库 - #607

Open
iasiv5 wants to merge 1 commit into
omdsh-dev:mainfrom
iasiv5:feat/discover-nested-repos
Open

feat(git): 支持工作区根目录为 Git 仓库时仍探测并展示子目录独立仓库#607
iasiv5 wants to merge 1 commit into
omdsh-dev:mainfrom
iasiv5:feat/discover-nested-repos

Conversation

@iasiv5

@iasiv5 iasiv5 commented Sep 9, 2026

Copy link
Copy Markdown

What

在「文件变动(Git 视角)」的仓库探测逻辑中,解除「若当前工作区根目录是 Git 仓库则立即短路返回」的限制。改为:将根仓库加入探测列表后,继续向下扫描一层直接子目录,若子目录中存在独立的 Git 仓库则一并发现并去重收集。

Why

在多项目复合工作区场景中,开发者常将根工作区初始化为一个顶层 Git 仓库(用于版本管理公共配置、工作区全局索引、任务记录或跨项目基础设施文档),同时在子目录下存放多个各自拥有独立 .git 的业务/插件代码库:

workspace/ (Git 仓库:管理通用规范与文档)
├── .git/
├── docs/
├── AGENTS.md
├── repo-a/ (独立的业务 Git 仓库)
│   └── .git/
└── repo-b/ (独立的插件 Git 仓库)
    └── .git/
  • 现状痛点:当前 discoverRepoRoots 的逻辑是 try { return [await directRepoRoot(cwd)]; } catch { ...扫描子目录... }。只要根目录有 .git,便立即短路返回 [cwd]。这导致 repositories.length === 1,前端侧边栏顶部的仓库切换下拉选择器(GitLens.tsxstatus.repositories.length > 1 判定)完全被隐藏,开发者无法在侧边栏内查看和切换子项目的 Git 变动与提交历史,只能看到外层根目录的 Git 状态。
  • 改动效果:根目录与子目录仓库同属一个视图候选集合,仓库切换下拉菜单正常展现,开发者可以在外层元仓库与各子工程仓库之间自由切换并管理变动。

Changes

  • src/git.ts
    • discoverRepoRoots(cwd):解除 try 块的短路返回,改为将根仓库放入 roots 数组后,继续扫描一层子目录(保留原先跳过 . 开头隐藏目录、node_modules 以及数量上限 DISCOVERY_LIMIT 的保护逻辑);
    • 保留既有的 pathIdentity 去重与后续基于 repoRootsCache 的并发防抖与缓存机制。
  • tests/git.spec.ts
    • 新增单元测试 discovers root and direct child repositories when root is also a git repository:模拟根目录与子目录同时被 git init 初始化的工作区,断言 repoRoots()status() 能准确返回两层仓库路径。

兼容性与边界

  • 普通单仓库(非复合目录):子目录没有 .gitroots.length === 1,下拉菜单保持隐藏,行为与视觉与原先完全一致,无任何回归。
  • 纯容器目录(根目录无 .gitcatch 静默处理,原样扫描并发现子目录仓库,行为与原先完全一致。
  • 性能影响:仅向下扫描一层直接子目录,且享有既有的 3 秒 repoRootsCache 缓存与 in-flight promise 复用,无额外开销。

验证

  • pnpm typecheck
  • pnpm lint
  • pnpm test tests/git.spec.ts ✅(13/13 包含新增多层仓库发现测试全部通过)
  • pnpm build
  • 本地 DSH 真机验证:根目录与子目录仓库同时出现在「文件变动」顶部下拉菜单中,分支切换、暂存、Diff 预览、提交与历史回溯均正常工作。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant